package fun.cyhgraph.controller.admin;

import fun.cyhgraph.dto.SetmealDTO;
import fun.cyhgraph.dto.SetmealPageDTO;
import fun.cyhgraph.result.PageResult;
import fun.cyhgraph.result.Result;
import fun.cyhgraph.service.SetmealService;
import fun.cyhgraph.vo.SetmealVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 管理端-套餐管理
 */
// 总结思路就是：（个人临时理解随时可推翻）
// 1、前端传来数据 controller使用一个拥有与数据中要接收属性相对应的(DTO、VO或Entity)对象来接收
// 2、controller调用service方法，将数据传过去
// 3、serviceImpl处理数据逻辑和具体操作，调用mapper方法将数据传给mapper层
// 4、mapper层做sql操作从数据库获取数据并封装
// 5、mapper将返回值按照返回类型返回给serviceImpl做处理---》service ---》 controller层----》返回给前端
@RestController("adminSetmealController")
@RequestMapping("/admin/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    /**
     * 新增套餐   (管理端)
     * @param setmealDTO
     * @return
     */
    @PostMapping
    @CacheEvict(cacheNames = "setmealCache", key = "#setmealDTO.categoryId") // 自动清除缓存   key:  setmealCache::100（动态id）
    public Result addSetmeal(@RequestBody SetmealDTO setmealDTO){
        log.info("新增套餐的信息：{}", setmealDTO);
        setmealService.addSetmeal(setmealDTO);
        return Result.success();
    }

    /**
     * 套餐条件分页查询    (管理端)
     * @param setmealPageDTO
     * @return
     */
    @GetMapping("/page")
    public Result<PageResult> getPageList(SetmealPageDTO setmealPageDTO){
        log.info("条件分页查询：{}", setmealPageDTO);
        // 将查询结果封装到PageResult对象中返回给前端
        PageResult pageResult = setmealService.getPageList(setmealPageDTO);
        return Result.success(pageResult);
    }

    /**
     * 批量删除套餐    (管理端)
     * @param ids
     * @return
     */
    @DeleteMapping
    @CacheEvict(cacheNames = "setmealCache", allEntries = true)  // 自动清除缓存  全部清理
    public Result deleteBatch(@RequestParam List<Integer> ids){//从 URL 中提取 ids 参数并转换为 List<Integer>。
                                                            //当客户端通过 ?key=value 形式传递参数时，使用 @RequestParam 绑定参数到方法参数。
        log.info("批量删除套餐的套餐id集合：{}", ids);
        setmealService.deleteBatch(ids);
        return Result.success();
    }

    /**
     * 根据id查询套餐   （管理端-修改页面回显数据）
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result<SetmealVO> getSetmealById(@PathVariable Integer id){
        log.info("要查询的套餐id：{}", id);
        SetmealVO setmealVO = setmealService.getSetmealById(id);
        return Result.success(setmealVO);
    }


    /**
     * 修改套餐    (管理端)
     * @param setmealDTO
     * @return
     */
    @PutMapping
    @CacheEvict(cacheNames = "setmealCache", allEntries = true)  // 自动清除缓存  全部清理
    public Result update(@RequestBody SetmealDTO setmealDTO){
        log.info("修改后的套餐信息：{}", setmealDTO);
        setmealService.update(setmealDTO);
        return Result.success();
    }

    /**
     * 根据id起售停售套餐    (管理端)
     * @param id
     * @return
     */
    @PutMapping("/status/{id}")
    @CacheEvict(cacheNames = "setmealCache", allEntries = true) // 自动清除缓存  全部清理
    public Result onOff(@PathVariable Integer id){
        log.info("套餐id:{}", id);
        setmealService.onOff(id);
        return Result.success();
    }




}
